<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>比较操作符</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="functions-logical.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="functions.html">快退</a></td><td width="60%" align="center" valign="bottom">章9. 函数和操作符</td><td width="10%" align="right" valign="top"><a href="functions.html">快进</a></td><td width="10%" align="right" valign="top"><a href="functions-math.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="FUNCTIONS-COMPARISON">9.2. 比较操作符</a></h1><a name="AEN6441"></a>
<p>可用的比较操作符在<a href="functions-comparison.html#FUNCTIONS-COMPARISON-TABLE">表9-1</a>显示。</p>
<div class="TABLE"><a name="FUNCTIONS-COMPARISON-TABLE"></a>
<p><b>表9-1. 比较操作符</b></p>
<table border="1" class="CALSTABLE"><col><col>
<thead>
<tr><th>操作符</th><th>描述</th></tr>
</thead>
<tbody>
<tr><td><tt class="LITERAL">&lt;</tt></td><td>小于</td></tr>
<tr><td><tt class="LITERAL">&gt;</tt></td><td>大于</td></tr>
<tr><td><tt class="LITERAL">&lt;=</tt></td><td>小于或等于</td></tr>
<tr><td><tt class="LITERAL">&gt;=</tt></td><td>大于或等于</td></tr>
<tr><td><tt class="LITERAL">=</tt></td><td>等于</td></tr>
<tr><td><tt class="LITERAL">&lt;&gt;</tt> 或 <tt class="LITERAL">!=</tt></td><td>不等于</td></tr>
</tbody>
</table>
</div>
<div class="NOTE">
<blockquote class="NOTE">
<p><b>【注意】</b> <tt class="LITERAL">!=</tt> 操作符在分析器阶段被转换成 <tt class="LITERAL">&lt;&gt;</tt> 。<tt class="LITERAL">!=</tt> 和 <tt class="LITERAL">&lt;&gt;</tt> 操作符是完全等价的。</p>
</blockquote>
</div>
<p>比较操作符可以用于所有可以比较的数据类型。所有比较操作符都是双目操作符，返回 <tt class="TYPE">boolean</tt> 类型数值；像 <tt class="LITERAL">1 &lt; 2 &lt; 3</tt> 这样的表达式是非法的(因为布尔值和 <tt class="LITERAL">3</tt> 之间不能做比较)。</p>
<p><a name="AEN6491"></a>除了比较操作符以外，我们还可以使用 <tt class="TOKEN">BETWEEN</tt> 构造。</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>a</i></tt> BETWEEN <tt class="REPLACEABLE"><i>x</i></tt> 和 <tt class="REPLACEABLE"><i>y</i></tt></pre>
<p>等效于</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>a</i></tt> &gt;= <tt class="REPLACEABLE"><i>x</i></tt> 和 <tt class="REPLACEABLE"><i>a</i></tt> &lt;= <tt class="REPLACEABLE"><i>y</i></tt></pre>
<p>类似的还有</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>a</i></tt> NOT BETWEEN <tt class="REPLACEABLE"><i>x</i></tt> 和 <tt class="REPLACEABLE"><i>y</i></tt></pre>
<p>等效于</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>a</i></tt> &lt; <tt class="REPLACEABLE"><i>x</i></tt> OR <tt class="REPLACEABLE"><i>a</i></tt> &gt; <tt class="REPLACEABLE"><i>y</i></tt></pre>
<p><a name="AEN6513"></a>这两种形式之间没有什么区别，只不过第一种形式需要一些CPU周期在内部将它改写成第二种形式。<tt class="TOKEN">BETWEEN SYMMETRIC</tt> 和 <tt class="LITERAL">BETWEEN</tt> 一样，只是没有要求 <tt class="LITERAL">AND</tt> 左边的参数小于或等于右边的参数；合适的范围是自动计算出来的。</p>
<p><a name="AEN6519"></a><a name="AEN6521"></a><a name="AEN6523"></a><a name="AEN6525"></a>要检查一个值是否为 NULL ，使用下面的构造：</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>expression</i></tt> IS NULL
<tt class="REPLACEABLE"><i>expression</i></tt> IS NOT NULL</pre>
<p>或者等效，但并不标准的构造</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>expression</i></tt> ISNULL
<tt class="REPLACEABLE"><i>expression</i></tt> NOTNULL</pre>
<p><a name="AEN6533"></a></p>
<p><span class="emphasis"><i class="EMPHASIS">不要</i></span>写 <tt class="LITERAL"><tt class="REPLACEABLE"><i>expression</i></tt> = NULL</tt> 因为 <tt class="LITERAL">NULL</tt> 是不"等于" <tt class="LITERAL">NULL</tt> 的。NULL 代表一个未知的数值，因此我们无法知道两个未知的数值是否相等。这个行为遵循 SQL 标准。</p>
<div class="TIP">
<blockquote class="TIP">
<p><b>【提示】</b>有些应用可能要求表达式 <tt class="LITERAL"><tt class="REPLACEABLE"><i>expression</i></tt> = NULL</tt> 在 <tt class="REPLACEABLE"><i>expression</i></tt> 为 NULL 时候返回真。我们强烈建议这样的应用修改成遵循 SQL 标准。但是，如果这样修改是不可能的，那么我们可以打开 <a href="runtime-config-compatible.html#GUC-TRANSFORM-NULL-EQUALS">transform_null_equals</a> 配置参数，让 PostgreSQL 将 <tt class="LITERAL">x = NULL</tt> 自动转换成 <tt class="LITERAL">x IS NULL</tt> 。在 PostgreSQL 版本 6.5 到7.1之间，这是缺省的行为。</p>
</blockquote>
</div>
<div class="NOTE">
<blockquote class="NOTE">
<p><b>【注意】</b>]如果 <tt class="REPLACEABLE"><i>expression</i></tt> 是行值，那么当行表达式本身为 NULL 或该行的所有字段都为 NULL 时，<tt class="LITERAL">IS NULL</tt> 将为真；当行表达式本身不为 NULL 并且该行的所有字段都不为 NULL 时，<tt class="LITERAL">IS NOT NULL</tt> 也将为真。这个规定符合 SQL 标准，但是与 8.2 之前的版本不兼容。</p>
</blockquote>
</div>
<p><a name="AEN6560"></a><a name="AEN6562"></a>如果有任何一个输入是 NULL ，那么普通的比较操作符生成 NULL(表示"未知")。另外一个比较的方法是用 <tt class="LITERAL">IS [<span class="OPTIONAL">NOT</span>] DISTINCT FROM</tt> 构造：</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>expression</i></tt> IS DISTINCT FROM <tt class="REPLACEABLE"><i>expression</i></tt>
<tt class="REPLACEABLE"><i>expression</i></tt> IS NOT DISTINCT FROM <tt class="REPLACEABLE"><i>expression</i></tt></pre>
<p>对于非 NULL 的输入 <tt class="LITERAL">IS DISTINCT FROM</tt> 与 <tt class="LITERAL">&lt;&gt;</tt> 操作符相同。但是，如果两个输入都是 NULL ，那么它将返回假；如果只有一个输入是 NULL ，那么它将返回真。类似的，对于非 NULL 的输入 <tt class="LITERAL">IS NOT DISTINCT FROM</tt> 与 <tt class="LITERAL">=</tt> 操作符相同。但是，如果两个输入都是 NULL ，那么它将返回真；如果只有一个输入是 NULL ，那么它将返回假。这样就很有效地把 NULL 当作一个普通数据值看待，而不是"未知"。</p>
<p><a name="AEN6578"></a><a name="AEN6580"></a><a name="AEN6582"></a><a name="AEN6584"></a><a name="AEN6586"></a><a name="AEN6588"></a>布尔数值可以用下面的构造进行测试</p>
<pre class="SYNOPSIS"><tt class="REPLACEABLE"><i>expression</i></tt> IS TRUE
<tt class="REPLACEABLE"><i>expression</i></tt> IS NOT TRUE
<tt class="REPLACEABLE"><i>expression</i></tt> IS FALSE
<tt class="REPLACEABLE"><i>expression</i></tt> IS NOT FALSE
<tt class="REPLACEABLE"><i>expression</i></tt> IS UNKNOWN
<tt class="REPLACEABLE"><i>expression</i></tt> IS NOT UNKNOWN</pre>
<p>这些构造将总是返回真或假，从来不返回 NULL ，即使操作数是 NULL 也如此。NULL 输入被当做逻辑数值"未知"。请注意实际上 <tt class="LITERAL">IS UNKNOWN</tt> 和 <tt class="LITERAL">IS NOT UNKNOWN</tt> 分别与 <tt class="LITERAL">IS NULL</tt> 和 <tt class="LITERAL">IS NOT NULL</tt> 相同，只是输入表达式必须是布尔类型。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="functions-logical.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="functions-math.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">逻辑操作符</td><td width="34%" align="center" valign="top"><a href="functions.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">数学函数和操作符</td></tr>
</table>
</div>
</body></html>